package com.xingshang.util;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.xingshang.model.po.Goods;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Service
@RequiredArgsConstructor
public class RedisService {

    private final RedisTemplate redisTemplate;

    // Redis键的前缀和常量定义
    public static final String USER_PAGE_PREFIX = "user:page:";
    private static final String GOODS_PAGE_KEY = "goods:page:"; // 商品分页数据的键前缀
    private static final String USER_PAGE_KEY = "user:page:"; // 商品分页数据的键前缀
    private static final String GOODS_TOTAL_KEY = "goods:total"; // 商品总数统计的键
    private static final String HOT_GOODS_KEY = "goods";
    private static final long CACHE_EXPIRE_TIME = 1; // 缓存过期时间（分钟）

    /**
     * 缓存商品分页数据
     *
     * @param page  页码
     * @param goods 商品列表数据
     */
    public void cacheGoodsPage(int page, IPage<?> goods) {
        String key = GOODS_PAGE_KEY + page;
        redisTemplate.opsForValue().set(key, goods, CACHE_EXPIRE_TIME, TimeUnit.MINUTES);
    }

    /**
     * 缓存用户分页数据
     *
     * @param cacheKey 缓存key
     * @param userPage 用户列表数据
     */
    public void cacheUserPage(String cacheKey, IPage<?> userPage) {
        redisTemplate.opsForValue().set(cacheKey, userPage, CACHE_EXPIRE_TIME, TimeUnit.MINUTES);
    }

    /**
     * 获取缓存的商品分页数据
     *
     * @param page 页码
     * @return 商品列表数据，如果缓存不存在则返回null
     */
    public IPage<?> getGoodsPage(int page) {
        String key = GOODS_PAGE_KEY + page;
        return (IPage<?>) redisTemplate.opsForValue().get(key);
    }

    /**
     * 获取缓存的用户分页数据
     *
     * @param cacheKey 缓存key
     * @return 商品列表数据，如果缓存不存在则返回null
     */
    public IPage<?> getUserPage(String cacheKey) {
        return (IPage<?>) redisTemplate.opsForValue().get(cacheKey);
    }

    /**
     * 清除用户相关缓存（可按前缀批量删除）
     */
    public void clearUserCache() {
        Set<String> keys = redisTemplate.keys(USER_PAGE_PREFIX + "*");
        if (keys != null && !keys.isEmpty()) {
            redisTemplate.delete(keys);
        }
    }


    /**
     * 缓存商品总数
     *
     * @param total 商品总数
     */
    public void cacheTotal(long total) {
        redisTemplate.opsForValue().set(GOODS_TOTAL_KEY, total, CACHE_EXPIRE_TIME,
                TimeUnit.MINUTES);
    }

    /**
     * 获取缓存的商品总数
     *
     * @return 商品总数，如果缓存不存在则返回null
     */
    public Long getTotal() {
        Object value = redisTemplate.opsForValue().get(GOODS_TOTAL_KEY);
        if (value == null) {
            return null;
        }
// 处理可能的类型转换，如果返回的是Integer类型，则转换为Long类型
        if (value instanceof Integer) {
            return ((Integer) value).longValue();
        }
        return (Long) value;
    }

    /**
     * 清除商品相关的所有缓存数据
     * 包括商品总数和分页数据
     */
    public void clearGoodsCache() {
// 清除所有商品相关的缓存
        redisTemplate.delete(GOODS_TOTAL_KEY);
// 这里可以添加清除所有分页缓存的逻辑
// 实际项目中可能需要更复杂的缓存清理策略
    }

    public List<?> getHotGoods() {
        return (List<?>) redisTemplate.opsForValue().get(HOT_GOODS_KEY);
    }

    public void cacheHotGoods(List<Goods> list) {
        redisTemplate.opsForValue().set(HOT_GOODS_KEY, list, CACHE_EXPIRE_TIME, TimeUnit.MINUTES);
    }
}
